#ifndef VIDDEVICE_H
#define VIDDEVICE_H

//Библиотека Qt.
#include <QThread>
#include <QMutex>
#include <QHash>
#include <QVariant>


//Внутренняя библиотека.
#include "params.h"


//Объявление внешних классов.
class VidStream;
class FileWriter;
class VidFrame;
class QTimer;


class VidDevice : public QThread
{
	Q_OBJECT
signals:
	void information(const QString &msg);
	void warning(const QString &msg);
	void critical(const QString &msg);
	void taskCompleted(int devindex);

	void sigSetParam(DevParam::SET_PARAM param, QObject *object);

	void framerateChanged(int framerate);

	void achievedTreshold(bool achieved);

public:
	enum DEVTYPE {VIDEO4LINUX2, FILEREADER};

	//Конструктор.
	VidDevice(int index, QObject *parent = NULL);

	//Деструктор.
	virtual ~VidDevice();

	//Функция возврата типа устройства.
	virtual VidDevice::DEVTYPE getType() = 0;

	//Функция конвертации типа устройства в строку.
	static QString typeToString(VidDevice::DEVTYPE devtype);

	//Функция возврата индекса устройства.
	int getIndex();

	//Функция установки базового имени устройства.
	void setBaseName(QString name);

	//Функция возврата базового имени устройства.
	QString getBaseName();

	//Функция возврата списка значений параметра устройства.
	virtual bool getListParam(DevParam::GET_LIST_PARAM param, QHash<int, QVariant> *valhash);

	//Функция возврата параметра устройства.
	virtual bool getParam(DevParam::GET_PARAM param, QVariant *value);

public slots:
	//Слот установки параметра устройства.
	virtual void slotSetParam(DevParam::SET_PARAM param, int value);

	//Слот установки параметра устройства.
	virtual void slotSetParam(DevParam::SET_PARAM param, bool value);

protected:
	//Указатель на видеопоток.
	VidStream *vidStream;

	QMutex mutex;

	//Функция активации нити.
	virtual void run();

	//Функция открытия устройства.
	virtual bool openDevice() = 0;

	//Функция закрытия устройства.
	virtual void closeDevice() = 0;

	//Функция запуска видеозахвата.
	virtual bool startCapturing() = 0;

	//Функция остановки видеозахвата.
	virtual bool stopCapturing() = 0;

	//Функция обработки видеокадра.
	void processVideo(VidFrame *vidframe, int *framerate);

	//Функция управления активностью детектора движения.
	void setMotionEnabled(bool enabled);

private:
	//Индекс устройства.
	int devIndex;

	//Базовое имя устройства.
	QString baseName;

	//Индекс видеокодека.
	int vCodecIndex;

	//Объект класса записи данных в файл.
	FileWriter *fileWriter;

	//Таймер для остановки записи видео в файл.
	QTimer *stopWriteTimer;

	//Функция управления активностью "ручной" записи в файл.
	void setFileWriterTrigger(bool is_absolute_switch);

private slots:
	//Слот смены режима работы устройства.
	void slotModeTriggered();

};

#endif
